/**
 * 认证中间件
 * 验证用户JWT令牌并处理权限控制
 */

const jwt = require('jsonwebtoken');
const config = require('../config');
const User = require('../models/user');

// 验证JSON Web Token
exports.protect = async (req, res, next) => {
    let token;
    
    // 从请求头中获取token
    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
        token = req.headers.authorization.split(' ')[1];
    }
    
    // 如果没有找到token
    if (!token) {
        return res.status(401).json({
            success: false,
            message: '未授权访问，请先登录'
        });
    }
    
    try {
        // 验证token
        const decoded = jwt.verify(token, config.jwt.secret);
        
        // 查找用户
        const user = await User.findById(decoded.id);
        
        // 如果用户不存在
        if (!user) {
            return res.status(401).json({
                success: false,
                message: '此令牌对应的用户不存在'
            });
        }
        
        // 在请求中添加用户信息
        req.user = user;
        next();
    } catch (error) {
        return res.status(401).json({
            success: false,
            message: '无效的令牌，请重新登录'
        });
    }
};

// 验证用户是否为管理员
exports.admin = (req, res, next) => {
    if (!req.user || req.user.role !== 'admin') {
        return res.status(403).json({
            success: false,
            message: '权限不足，只有管理员可以访问'
        });
    }
    next();
};

// 验证用户是否为资源所有者或管理员
exports.checkOwnership = (model) => async (req, res, next) => {
    try {
        // 获取资源ID
        const resourceId = req.params.id;
        
        // 查找资源
        const resource = await model.findById(resourceId);
        
        // 如果资源不存在
        if (!resource) {
            return res.status(404).json({
                success: false,
                message: '资源不存在'
            });
        }
        
        // 检查所有权（对于游戏或评论，作者/用户字段可能命名不同）
        const ownerId = resource.author || resource.user;
        
        // 如果用户是管理员或资源所有者
        if (req.user.role === 'admin' || ownerId.toString() === req.user._id.toString()) {
            // 将资源添加到请求中
            req.resource = resource;
            next();
        } else {
            return res.status(403).json({
                success: false,
                message: '权限不足，您不是该资源的所有者'
            });
        }
    } catch (error) {
        return res.status(500).json({
            success: false,
            message: '服务器错误'
        });
    }
}; 